package com.xinke.module.system.service.tenant;

import com.xinke.component.tenant.config.TenantProperties;
import com.xinke.component.tenant.core.context.TenantContextHolder;
import com.xinke.module.system.service.tenant.handler.TenantInfoHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import com.xinke.module.system.model.vo.tenant.*;
import com.xinke.module.system.model.entity.tenant.TenantDO;
import com.xinke.component.common.pojo.PageResult;
import com.xinke.component.common.pojo.PageParam;
import com.xinke.component.common.util.object.BeanUtils;

import com.xinke.module.system.mapper.tenant.TenantMapper;

import static com.xinke.component.common.exception.util.ServiceExceptionUtil.exception;
import static com.xinke.module.system.enums.ErrorCodeConstants.*;

/**
 * 租户 Service 实现类
 *
 * @author yzx
 */
@Service
@Validated
public class TenantServiceImpl implements TenantService {



    @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
    @Autowired(required = false) // 由于 yudao.tenant.enable 配置项，可以关闭多租户的功能，所以这里只能不强制注入
    private TenantProperties tenantProperties;
    @Resource
    private TenantMapper tenantMapper;

    @Override
    public TenantDO getTenantByName(String name) {
        return tenantMapper.selectByName(name);
    }
    @Override
    public Long createTenant(TenantSaveReqVO createReqVO) {
        // 插入
        TenantDO tenant = BeanUtils.toBean(createReqVO, TenantDO.class);
        tenantMapper.insert(tenant);
        // 返回
        return tenant.getTenantId();
    }

    @Override
    public void updateTenant(TenantSaveReqVO updateReqVO) {
        // 校验存在
        validateTenantExists(updateReqVO.getTenantId());
        // 更新
        TenantDO updateObj = BeanUtils.toBean(updateReqVO, TenantDO.class);
        tenantMapper.updateById(updateObj);
    }

    @Override
    public void deleteTenant(Long tenantId) {
        // 校验存在
        validateTenantExists(tenantId);
        // 删除
        tenantMapper.deleteById(tenantId);
    }

    private void validateTenantExists(Long tenantId) {
        if (tenantMapper.selectById(tenantId) == null) {
            throw exception(null);
        }
    }

    @Override
    public TenantDO getTenant(Long tenantId) {
        return tenantMapper.selectById(tenantId);
    }

    @Override
    public PageResult<TenantDO> getTenantPage(TenantPageReqVO pageReqVO) {
        return tenantMapper.selectPage(pageReqVO);
    }

    @Override
    public void handleTenantInfo(TenantInfoHandler handler) {
        // 如果禁用，则不执行逻辑
        if (isTenantDisable()) {
            return;
        }
        // 获得租户
        TenantDO tenant = getTenant(TenantContextHolder.getRequiredTenantId());
        // 执行处理器
        handler.handle(tenant);
    }
    private static boolean isSystemTenant(TenantDO tenant) {
        return Objects.equals(tenant.getPackageId(), TenantDO.PACKAGE_ID_SYSTEM);
    }

    private boolean isTenantDisable() {
        return tenantProperties == null || Boolean.FALSE.equals(tenantProperties.getEnable());
    }
}